home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok69.lha / NTSC4NTSC / NTSC4NTSC.mod < prev    next >
Text File  |  1993-08-15  |  13KB  |  384 lines

  1. (* ------------------------------------------------------------------------
  2.   :Program.       NTSC for NTSC
  3.   :Contents.      Get 60 Hz for NTSC screens
  4.   :Author.        Kai Bolay [kai]
  5.   :Address.       Snail-Mail:              E-Mail:
  6.   :Address.       Hoffmannstraße 168       UUCP: kai@amokle.tynet.sub.org
  7.   :Address.       D-7250 Leonberg 1        FIDO: 2:247/706.3
  8.   :History.       v1.0 [kai] 15-Aug-91 (started written history)
  9.   :History.       v1.1 [kai] 16-Aug-91 (bug fixes)
  10.   :History.       v1.2 [kai] 26-Sep-91 (+ improved stdHeight-handling)
  11.   :History.       v1.3 [kai] 19-Nov-91 (+ AutoScroll, force)
  12.   :History.       v1.4 [kai] 14-Dec-91 (+ tried to improve, no success)
  13.   :History.       v1.5 [kai] 19-Jan-92 (+ removed illegal writes)
  14.   :History.       v1.6 [kai] 24-Mar-92 (+ NEWLOOK for all screens)
  15.   :Copyright.     Freeware
  16.   :Language.      Oberon
  17.   :Translator.    AMIGA OBERON v2.25d
  18.   :Remark.        Thanks to Peter Cherna
  19.   :Remark.        Thanks to Franz Schwarz for telling me a possibility to
  20.   :Remark.        remove illegal writes to the TagList...
  21.   :Remark.        NEWLOOK was inspired by Martin Berndt's TagScreens
  22.   :Usage.         STDPAL/S,STDNTSC/S,USEAUTO/S,FORCENTSC/S,NEWLOOK/S
  23.   :Usage.         The first two options describe behaviour for StdHeight-
  24.   :Usage.         Screens. The third says use AutoScroll instead of PAL.
  25.   :Usage.         The forth always forces NTSC, the last enables the 2.0
  26.   :Usage.         look for all screens.
  27. ------------------------------------------------------------------------ *)
  28. MODULE NTSC4NTSC;
  29.  
  30. IMPORT
  31.   e: Exec, I: Intuition, g: Graphics, u: Utility, d: Dos, y: SYSTEM
  32.   (* $IF DoIt *) ,dio: DebugIo (* $END *);
  33.  
  34. CONST
  35.   OpenScreenOfs = -198;
  36.   OpenScreenTagsOfs = -612;
  37.   (* $IF DoIt *)
  38.   Version = "$VER: NTSC4NTSC v1.6 (24-Mar-92) by Kai Bolay (Debug)\r\n";
  39.   (* $ELSE *)
  40.   Version = "$VER: NTSC4NTSC v1.6 (24-Mar-92) by Kai Bolay\r\n";
  41.   (* $END *)
  42.   Template = "STDPAL/S,STDNTSC/S,USEAUTO/S,FORCENTSC/S,NEWLOOK/S";
  43.   ntscMonitorSet = y.VAL (LONGSET, g.ntscMonitorID);
  44.   palMonitorSet = y.VAL (LONGSET, g.palMonitorID);
  45.   STDPAL    = 0;
  46.   STDNTSC   = 1;
  47.   USEAUTO   = 2;
  48.   FORCENTSC = 3;
  49.   NEWLOOK   = 4;
  50.   NumOpts   = 5;
  51. TYPE
  52.   TagArrayPtr = UNTRACED POINTER TO ARRAY 1 OF u.TagItem;
  53.   ExtNewScreenPtr = UNTRACED POINTER TO I.ExtNewScreen;
  54.   OpenScreenProc = PROCEDURE (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  55.   OpenScreenTagsProc = PROCEDURE (newScreen{8}: I.NewScreenPtr;
  56.                                   paraTagList{9}: TagArrayPtr): I.ScreenPtr;
  57. VAR
  58.   OldOpenScreen: OpenScreenProc;
  59.   OldOpenScreenTags: OpenScreenTagsProc;
  60.   OldNormRows: INTEGER;
  61.   OScanRect: g.Rectangle;
  62.   Opt: ARRAY NumOpts OF LONGINT;
  63.   RD: d.RDArgsPtr;
  64.   StdHeightMonitorSet: LONGSET;
  65.  
  66. (* $Debug- *)
  67. (* $StackChk- $SaveRegs+ Prepare to work in other tasks *)
  68. PROCEDURE NewOpenScreenTags* (newScreen{8}: I.NewScreenPtr;
  69.                               paraTagList{9}: TagArrayPtr): I.ScreenPtr;
  70. TYPE
  71.   PenArray = ARRAY 1 OF INTEGER;
  72. CONST
  73.   Pens = PenArray (-1);
  74.   Mask = LONGSET {0, 2, 5, 6, 7, 10, 11, 12, 15, 16, 17, 18};
  75.   ES = I.EasyStruct (y.SIZE (I.EasyStruct), LONGSET {}, y.ADR ("NTSC4NTSC"),
  76.   y.ADR ("Which Mode should be used for the\nscreen named \"%s\"?"),
  77.   y.ADR ("NTSC|PAL"));
  78.   MaxTags = 10;
  79. VAR
  80.   Base: I.IntuitionBasePtr;
  81.   TState, Tag, DisplayTag, TypeTag, ScrollTag: u.TagItemPtr;
  82.   Tags: ARRAY MaxTags OF u.TagItem;
  83.   DisplayID: LONGINT;
  84.   DisplaySet: LONGSET;
  85.   OScanRect: g.Rectangle;
  86.   Height: INTEGER;
  87.   Title: e.STRPTR;
  88.   DoScroll, ScrollMagic: BOOLEAN;
  89.   ListEnd: INTEGER;
  90.   tagList: u.TagItemPtr;
  91.   scrPtr: I.ScreenPtr;
  92.  
  93. BEGIN
  94.   Base := y.REG (14);
  95.  
  96.   (* $IF DoIt *)
  97.   dio.WriteString ("\nHi Folks!\n");
  98.   (* $END *)
  99.  
  100.   ListEnd := 0;
  101.  
  102.   IF paraTagList # NIL THEN
  103.     tagList := u.CloneTagItems (paraTagList^);
  104.     IF tagList = NIL THEN
  105.       (* $IF DoIt *)
  106.       dio.WriteString ("No Mem to clone!\n");
  107.       (* $END *)
  108.       y.SETREG (14, Base);
  109.       RETURN OldOpenScreenTags (newScreen, paraTagList);
  110.     END;
  111.   ELSE
  112.     tagList := NIL;
  113.   END;
  114.  
  115.   Height := I.stdScreenHeight; DisplayTag := NIL; DisplayID := 0;
  116.   ScrollMagic := TRUE; DoScroll := FALSE;
  117.   Title := y.ADR ("");
  118.  
  119.   IF newScreen # NIL THEN
  120.     Height := newScreen.height;
  121.     Title := newScreen.defaultTitle;
  122.     DisplayID := I.UIntToLong (y.VAL (INTEGER, newScreen.viewModes));
  123.     (* $IF DoIt *)
  124.     dio.WriteString ("NewScreen gibbet:\n");
  125.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  126.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  127.     (* $END *)
  128.   END; (* IF *)
  129.  
  130.   IF tagList # NIL THEN
  131.     TState := tagList;
  132.     LOOP
  133.       Tag := u.NextTagItem (TState);
  134.       IF Tag = NIL THEN EXIT END;
  135.       CASE y.VAL (LONGINT, Tag.tag) OF
  136.       | I.saDisplayID:  DisplayTag := Tag; DisplayID := Tag.data;
  137.       | I.saType:       TypeTag := Tag;
  138.       | I.saAutoScroll: ScrollTag := Tag;
  139.       | I.saHeight:     Height := SHORT (y.VAL (LONGINT, Tag.data));
  140.       | I.saTitle:      Title := Tag.data;
  141.       | I.saOverscan:   ScrollMagic := FALSE;
  142.       | I.saDClip:      ScrollMagic := FALSE;
  143.       ELSE
  144.       END;
  145.     END;
  146.     (* $IF DoIt *)
  147.     dio.WriteString ("TagList gibbet:\n");
  148.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  149.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  150.     (* $END *)
  151.   END;
  152.  
  153.   DisplaySet := y.VAL (LONGSET, DisplayID) * Mask;
  154.   (* $IF DoIt *)
  155.   dio.WriteString ("The DisplayID: "); dio.WriteHex (y.VAL (LONGINT, DisplaySet), 8); dio.WriteLn;
  156.   (* $END *)
  157.  
  158.   IF Opt[FORCENTSC] # 0 THEN
  159.     DisplaySet := DisplaySet - palMonitorSet;
  160.   END;
  161.  
  162.   IF (palMonitorSet * DisplaySet # palMonitorSet) AND
  163.      (ntscMonitorSet * DisplaySet # ntscMonitorSet) AND
  164.      (I.QueryOverscan (y.VAL (LONGINT, ntscMonitorSet + DisplaySet),
  165.                        OScanRect, I.oScanText) # 0) THEN
  166.     (* $IF DoIt *)
  167.     dio.WriteString ("Let's patch: ");
  168.     (* $END *)
  169.     IF Height = I.stdScreenHeight THEN
  170.       (* $IF DoIt *)
  171.       dio.WriteString ("Std-Height\n");
  172.       (* $END *)
  173.       IF StdHeightMonitorSet = LONGSET {} THEN
  174.         IF I.EasyRequest (NIL, y.ADR (ES), NIL, Title) = 1 THEN
  175.           DisplayID := y.VAL (LONGINT, ntscMonitorSet + DisplaySet);
  176.         ELSE
  177.           DisplayID := y.VAL (LONGINT, palMonitorSet + DisplaySet);
  178.         END;
  179.       ELSE
  180.         DisplayID := y.VAL (LONGINT, StdHeightMonitorSet + DisplaySet);
  181.       END;
  182.     ELSE
  183.       IF (Height <= OScanRect.maxY - OScanRect.minY + 1) AND (Opt[STDPAL] = 0) THEN
  184.         (* $IF DoIt *)
  185.         dio.WriteString ("NTSC\n");
  186.         (* $END *)
  187.         DisplayID := y.VAL (LONGINT, ntscMonitorSet + DisplaySet);
  188.       ELSE
  189.         IF (Opt[USEAUTO] = 0) THEN
  190.           (* $IF DoIt *)
  191.           dio.WriteString ("PAL\n");
  192.           (* $END *)
  193.           DisplayID := y.VAL (LONGINT, palMonitorSet + DisplaySet);
  194.         ELSE
  195.           DoScroll := TRUE;
  196.           DisplayID := y.VAL (LONGINT, ntscMonitorSet + DisplaySet);
  197.           IF TypeTag # NIL THEN
  198.             TypeTag.data := y.VAL (LONGINT, y.VAL (LONGSET, TypeTag.data) +
  199.                                             LONGSET {I.autoScroll});
  200.           END;
  201.           IF ScrollTag # NIL THEN
  202.             ScrollTag.data := I.LTRUE;
  203.           END;
  204.         END;
  205.       END;
  206.     END;
  207.   END;
  208.  
  209.   IF Opt[NEWLOOK] # 0 THEN
  210.     Tags[ListEnd].tag := I.saPens; Tags[ListEnd].data := y.ADR (Pens);
  211.     INC (ListEnd);
  212. (*
  213.     Tags[ListEnd].tag := I.saFullPalette; Tags[ListEnd].data := I.LTRUE;
  214.     INC (ListEnd);
  215. *)
  216.   END; (* IF *)
  217.  
  218.   IF DisplayTag # NIL THEN
  219.     (* $IF DoIt *)
  220.     dio.WriteString ("ab in den DispTag!\n");
  221.     (* $END *)
  222.     DisplayTag.data := DisplayID;
  223.   ELSE
  224.     Tags[ListEnd].tag := I.saDisplayID; Tags[ListEnd].data := DisplayID;
  225.     INC (ListEnd);
  226.   END;
  227.   IF DoScroll THEN
  228.     (* $IF DoIt *)
  229.     dio.WriteString ("Schkroll!!\n");
  230.     (* $END *)
  231.     IF (TypeTag = NIL) AND (ScrollTag = NIL) THEN
  232.       Tags[ListEnd].tag := I.saAutoScroll; Tags[ListEnd].data := I.LTRUE;
  233.       INC (ListEnd);
  234.     END;
  235.     IF ScrollMagic THEN
  236.       Tags[ListEnd].tag := I.saOverscan; Tags[ListEnd].data := I.oScanText;
  237.       INC (ListEnd);
  238.     END;
  239.   END;
  240.   IF ListEnd > 0 THEN
  241.     (* $IF DoIt *)
  242.     dio.WriteString ("Tags gibbet!\n");
  243.     (* $END *)
  244.     IF tagList = NIL THEN
  245.       Tags[ListEnd].tag := u.done; Tags[ListEnd].data := 0;
  246.       INC (ListEnd);
  247.     ELSE
  248.       Tags[ListEnd].tag := u.more; Tags[ListEnd].data := tagList;
  249.       INC (ListEnd);
  250.     END;
  251.     tagList := y.ADR (Tags);
  252.   END;
  253.  
  254.   (* $IF DoIt *)
  255.   d.Delay (3*50);
  256.   (* $END *)
  257.  
  258.   y.SETREG (14, Base);
  259.   scrPtr := OldOpenScreenTags (newScreen, tagList);
  260.   IF tagList # NIL THEN
  261.     paraTagList := y.VAL (TagArrayPtr, tagList);
  262.     u.FreeTagItems (paraTagList^);
  263.   END;
  264.  
  265.   (* $IF DoIt *)
  266.   d.Delay (3*50);
  267.   (* $END *)
  268.  
  269.   RETURN scrPtr;
  270. END NewOpenScreenTags;
  271.  
  272. (* $StackChk- $SaveRegs+ Prepare to work in other tasks *)
  273. PROCEDURE NewOpenScreen* (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  274. VAR
  275.   Base: I.IntuitionBasePtr;
  276.   nScrPtr: I.NewScreenPtr;
  277.   scrPtr: I.ScreenPtr;
  278.  
  279. BEGIN
  280.   (* $IF DoIt *)
  281.   dio.WriteString ("Mäthschick!!!\n");
  282.   (* $END *)
  283.   Base := y.REG (14);
  284.   (* Do the magic *)
  285.   IF (I.nsExtended IN newScreen.ns.type) THEN
  286.     nScrPtr := e.AllocVec (y.SIZE (I.NewScreen), LONGSET {});
  287.     IF nScrPtr = NIL THEN
  288.       y.SETREG (14, Base);
  289.       RETURN OldOpenScreen (newScreen);
  290.     END;
  291.     e.CopyMem (newScreen^, nScrPtr^, y.SIZE (I.NewScreen));
  292.     EXCL (nScrPtr.type, I.nsExtended);
  293.     y.SETREG (14, Base);
  294.     scrPtr := NewOpenScreenTags (nScrPtr, newScreen.extension);
  295.     e.FreeVec (nScrPtr);
  296.     RETURN scrPtr;
  297.   ELSE
  298.     y.SETREG (14, Base);
  299.     RETURN NewOpenScreenTags (newScreen, NIL);
  300.   END;
  301. END NewOpenScreen;
  302. (* $Debug= *)
  303.  
  304. BEGIN
  305.   (* $IF DoIt *)
  306.   dio.OpenIo;
  307.   dio.WriteString ("Jappadappaduuu!\n");
  308.   (* $END *)
  309.   (* $IF SmallData *)
  310.   y.SETREG (0, d.Write (d.Output (), "No SmallData please!\n", 21));
  311.   (* $ELSE *)
  312.   y.SETREG (0, d.Write (d.Output (), Version[6], y.SIZE (Version)-6));
  313.   (* 2.04 should be :-) *)
  314.   IF I.int.libNode.version < 37 THEN
  315.     IF d.Output () # NIL THEN
  316.       y.SETREG (0, d.Write (d.Output (), "Sorry, I need OS 2.04!\n", 23));
  317.     END;
  318.     HALT (20);
  319.   END;
  320.  
  321.   (* NTSC & PAL available? *)
  322.   IF (g.FindDisplayInfo (g.palMonitorID) = NIL) OR
  323.      (g.FindDisplayInfo (g.ntscMonitorID) = NIL) THEN
  324.     y.SETREG (0, d.PutStr ("Sorry, PAL & NTSC must be available!\n"));
  325.     HALT (20);
  326.   END;
  327.  
  328.   Opt[STDPAL] := 0; Opt[STDNTSC] := 0; Opt[USEAUTO] := 0;
  329.   Opt[FORCENTSC] := 0; Opt[NEWLOOK] := 0;
  330.  
  331.   RD := d.ReadArgs (Template, Opt, NIL);
  332.   IF RD = NIL THEN
  333.     d.PrintF ("Usage: %s\n", y.ADR (Template));
  334.     HALT (20);
  335.   END; (* IF *)
  336.   IF (Opt[FORCENTSC] # 0) THEN
  337.     Opt[STDNTSC] := -1;
  338.     Opt[USEAUTO] := -1;
  339.   END;
  340.   IF (Opt[STDPAL] # 0) AND (Opt[STDNTSC] # 0) THEN
  341.     y.SETREG (0, d.PutStr ("Sorry, PAL & NTSC together is not possible!\n"));
  342.     HALT (20);
  343.   END;
  344.   IF Opt[STDPAL]  # 0 THEN StdHeightMonitorSet := palMonitorSet END;
  345.   IF Opt[STDNTSC] # 0 THEN StdHeightMonitorSet := ntscMonitorSet END;
  346.  
  347.   (* Patch *)
  348.   e.Forbid;
  349.   OldOpenScreen := y.VAL (OpenScreenProc,
  350.                           e.SetFunction (I.int, OpenScreenOfs,
  351.                                          y.VAL (e.PROC, NewOpenScreen)));
  352.   OldOpenScreenTags := y.VAL (OpenScreenTagsProc,
  353.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  354.                                              y.VAL (e.PROC, NewOpenScreenTags)));
  355.   e.Permit;
  356.  
  357.   (* Wait for Break *)
  358.   y.SETREG (0, e.Wait (LONGSET {d.ctrlC})); (* ... *)
  359.  
  360.   (* Unpatch *)
  361.   e.Forbid;
  362.   OldOpenScreen := y.VAL (OpenScreenProc,
  363.                           e.SetFunction (I.int, OpenScreenOfs,
  364.                                          y.VAL (e.PROC, OldOpenScreen)));
  365.   OldOpenScreenTags := y.VAL (OpenScreenTagsProc,
  366.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  367.                                              y.VAL (e.PROC, OldOpenScreenTags)));
  368.   e.Permit;
  369.   IF (y.VAL (y.ADDRESS, OldOpenScreen)     # y.VAL (y.ADDRESS, NewOpenScreen)    ) OR
  370.      (y.VAL (y.ADDRESS, OldOpenScreenTags) # y.VAL (y.ADDRESS, NewOpenScreenTags)) THEN
  371.     IF I.DisplayAlert (I.recoveryAlert,
  372.                        "\x00\x10\x10Someone else patched too. Safety cannot be guarateed, please reboot!\o\n\x00\x10\x1A     -> Reboot <-                           -> Hope and pray <-     \o\o",
  373.                        40) THEN
  374.       e.ColdReboot;
  375.     END;
  376.   END;
  377.   (* $END *)
  378.   (* $IF DoIt *)
  379.   dio.CloseIo;
  380.   (* $END *)
  381. CLOSE
  382.   IF RD # NIL THEN d.FreeArgs (RD); RD := NIL END;
  383. END NTSC4NTSC.
  384.